home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2007 December / PCWKCD1207B.iso / Blogowanie poza sfera / Flock 0.9.1.3 stable / flock-0.9.1.3.en-US.win32.exe / flock / components / flockDeliciousService.js < prev    next >
Text File  |  2007-10-12  |  22KB  |  638 lines

  1. // BEGIN FLOCK GPL
  2. // 
  3. // Copyright Flock Inc. 2005-2007
  4. // http://flock.com
  5. // 
  6. // This file may be used under the terms of of the
  7. // GNU General Public License Version 2 or later (the "GPL"),
  8. // http://www.gnu.org/licenses/gpl.html
  9. // 
  10. // Software distributed under the License is distributed on an "AS IS" basis,
  11. // WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
  12. // for the specific language governing rights and limitations under the
  13. // License.
  14. // 
  15. // END FLOCK GPL
  16. //
  17.  
  18. const Cc = Components.classes;
  19. const Ci = Components.interfaces;
  20. const Cr = Components.results;
  21. const Cu = Components.utils;
  22.  
  23. const CLASS_ID                      = Components.ID ('{5c54771f-2628-4200-af16-f94609177abd}');
  24. const CLASS_NAME                    = "Flock Delicious Service";
  25. const CONTRACT_ID                   = "@flock.com/delicious-service;1";
  26. const PREFERENCES_CONTRACTID        = "@mozilla.org/preferences-service;1";
  27. const SERVICE_ENABLED_PREF          = "flock.service.delicious.enabled";
  28. const CATEGORY_COMPONENT_NAME       = "Delicious JS Component"
  29. const CATEGORY_ENTRY_NAME           = "delicious"
  30.  
  31. const RDFS = Cc['@mozilla.org/rdf/rdf-service;1'].getService (Ci.nsIRDFService);
  32. const PREFS = Components.classes[PREFERENCES_CONTRACTID].getService(Ci.nsIPrefBranch);
  33.  
  34. // migration constants
  35. const WEBSERVICE_PREF = "flock.favorites.webservice.id";
  36. const OLD_DELICIOUS_PW_HOST = ":favorites:webservice:delicious:";
  37.  
  38. var gCompTK;
  39. function getCompTK() {
  40.   if (!gCompTK) {
  41.     gCompTK = Cc["@flock.com/singleton;1"].getService(Ci.flockISingleton)
  42.       .getSingleton("chrome://browser/content/flock/services/common/load-compTK.js")
  43.       .wrappedJSObject;
  44.   }
  45.   return gCompTK;
  46. }
  47.  
  48. var gTimers = [];  // For use with the scheduler
  49.  
  50. const DELICIOUS_FAVICON = 'http://del.icio.us/favicon.ico';
  51.  
  52. function loadLibraryFromSpec(aSpec) {
  53.   var loader = Cc['@mozilla.org/moz/jssubscript-loader;1']
  54.     .getService(Ci.mozIJSSubScriptLoader);
  55.  
  56.   loader.loadSubScript(aSpec);
  57. }
  58.  
  59. loadLibraryFromSpec("chrome://browser/content/flock/favorites/deliciousApi.js");
  60. loadLibraryFromSpec("chrome://browser/content/flock/favorites/onlineFavoritesBackend.js");
  61.  
  62.  
  63. function flockDeliciousService() {
  64.   var obs = Cc["@mozilla.org/observer-service;1"].getService (Ci.nsIObserverService);
  65.   obs.addObserver (this, 'xpcom-shutdown', false);
  66.  
  67.   this._sync_worker_timer = null;
  68.  
  69.   this._state = 'idle';
  70.  
  71.   this.status = Ci.flockIWebService.STATUS_UNKNOWN;
  72.  
  73.   this.acUtils = Cc["@flock.com/account-utils;1"].getService(Ci.flockIAccountUtils);
  74.   this.url = "http://del.icio.us";
  75.   this.api = new DeliciousAPI('https://api.del.icio.us/v1/');
  76.   this.mIsInitialized = false;
  77.   this._ctk = {
  78.     interfaces: [
  79.       "nsISupports",
  80.       "nsISupportsCString",
  81.       "nsIClassInfo",
  82.       "nsIObserver",
  83.       "nsITimerCallback",
  84.       "flockIWebService",
  85.       "flockIManageableWebService",
  86.       "flockIBookmarkWebService",
  87.       "flockIPollingService",
  88.       "flockIMigratable",
  89.     ],
  90.     shortName: "delicious",
  91.     fullName: "Del.icio.us",
  92.     description: CLASS_NAME,
  93.     favicon: DELICIOUS_FAVICON,
  94.     CID: CLASS_ID,
  95.     contractID: CONTRACT_ID,
  96.     accountClass: flockDeliciousAccount
  97.   };
  98.   this._logger = Cc["@flock.com/logger;1"].createInstance(Ci.flockILogger);
  99.   this._logger.init ("delicious");
  100.   this._profiler = Cc["@flock.com/profiler;1"].getService(Ci.flockIProfiler);
  101.  
  102.   this.init();
  103. }
  104.  
  105.  
  106. flockDeliciousService.prototype.init = 
  107. function flockDeliciousService_init()
  108. {
  109.   // Prevent re-entry
  110.   if (this.mIsInitialized) return;
  111.   this.mIsInitialized = true;
  112.  
  113.   var evtID = this._profiler.profileEventStart("delicious-init");
  114.   this._logger.info (".init()");
  115.  
  116.   // Determine whether this service has been disabled, and unregister if so.
  117.   this.prefService = Cc["@mozilla.org/preferences-service;1"].getService(Ci.nsIPrefBranch);
  118.   if ( this.prefService.getPrefType(SERVICE_ENABLED_PREF) &&
  119.        !this.prefService.getBoolPref(SERVICE_ENABLED_PREF) )
  120.   {
  121.     this._logger.info("Pref "+SERVICE_ENABLED_PREF+" set to FALSE... not initializing.");
  122.     var catMgr = Cc["@mozilla.org/categorymanager;1"].getService(Ci.nsICategoryManager);
  123.     catMgr.deleteCategoryEntry("wsm-startup", CATEGORY_COMPONENT_NAME, true);
  124.     catMgr.deleteCategoryEntry("flockMigratable", CATEGORY_COMPONENT_NAME, true);
  125.     catMgr.deleteCategoryEntry("flockWebService", CATEGORY_ENTRY_NAME, true);
  126.     return;
  127.   }
  128.  
  129.   // get the favorites service
  130.   var fsvc = Cc['@mozilla.org/rdf/datasource;1?name=flock-favorites'].getService (Ci.flockIFavoritesService);
  131.   fsvc.QueryInterface (Ci.nsIRDFDataSource);
  132.   // get a coop interface to it
  133.   this._coop = Cc['@flock.com/singleton;1'].getService(Ci.flockISingleton).getSingleton('chrome://browser/content/flock/common/load-faves-coop.js').wrappedJSObject;
  134.  
  135.   if (this._coop.Service.exists ('urn:delicious:service')) {
  136.     this._service = this._coop.get ('urn:delicious:service');
  137.   } else {
  138.     this._service = new this._coop.Service ('urn:delicious:service', {
  139.       name: 'delicious',
  140.       desc: 'del.icio.us'
  141.     });
  142.   }
  143.   this._service.serviceId = CONTRACT_ID;
  144.   this._service.logoutOption = false;
  145.  
  146.   // Load Web Detective file
  147.   this.webDetective = this.acUtils.useWebDetective("delicious.xml");
  148.   this._service.domains = this.webDetective.getString("delicious", "domains", "icio.us");
  149.  
  150.   // Now that we know the service URN, we can register this service
  151.   // with the Web Service Manager.
  152.   this.urn = this._service.id();
  153.   this.bookmarksRootUrn = "urn:delicious:bookmarks:";
  154.  
  155.   this._profiler.profileEventEnd(evtID, "");
  156. }
  157.  
  158. // BEGIN flockIWebService interface
  159. flockDeliciousService.prototype.title = 'del.icio.us';
  160. flockDeliciousService.prototype.icon = DELICIOUS_FAVICON;
  161.  
  162. flockDeliciousService.prototype.addAccountById =
  163. function (aAccountID, aIsTransient, aListener) {
  164.   this._logger.debug("{flockIWebService}.addAccountById('"+aAccountID+"', "+aIsTransient+", aListener)");
  165.  
  166.   var acct = onlineFavoritesBackend.createAccount(this, aAccountID, aIsTransient);
  167.   if (aListener) aListener.onSuccess(acct, "addAccount");
  168.  
  169.   return acct;
  170. }
  171.  
  172. flockDeliciousService.prototype.removeAccount =
  173. function (aUrn) {
  174.   this._logger.debug("{flockIWebService}.removeAccount('"+aUrn+"')"); 
  175.   onlineFavoritesBackend.removeAccount(this, aUrn);
  176. }
  177. // END flockIWebService interface
  178.  
  179.  
  180. // BEGIN flockIManageableWebService interface
  181. flockDeliciousService.prototype.updateAccountStatusFromDocument =
  182. function (aDocument) {
  183.   this._logger.debug("{flockIManageableWebService}.updateAccountStatusFromDocument()");
  184.   if (this.webDetective.detect("delicious", "loggedout", aDocument, null)) {
  185.     this.acUtils.markAllAccountsAsLoggedOut(CONTRACT_ID);
  186.   } else if (this.webDetective.detect("delicious", "loggedin", aDocument, null)) {
  187.     var results = Cc["@mozilla.org/hash-property-bag;1"].createInstance(Ci.nsIWritablePropertyBag2);
  188.     if (this.webDetective.detect("delicious", "accountinfo", aDocument, results)) {
  189.       var accountID = results.getPropertyAsAString("accountid");
  190.       var accountURN = this.acUtils.getAccountURNById(this.urn, accountID);
  191.       this.acUtils.ensureOnlyAuthenticatedAccount(accountURN);
  192.     }
  193.   }
  194. }
  195.  
  196. flockDeliciousService.prototype.logout = function() {
  197.   this._logger.debug("{flockIWebServiceService}.logout()");
  198.   var cookieManager = Components.classes["@mozilla.org/cookiemanager;1"]
  199.                                 .getService(Components.interfaces.nsICookieManager);
  200.   cookieManager.remove(".del.icio.us", "_user", "/", false);
  201. }
  202. // END flockIManageableWebService interface
  203.  
  204. flockDeliciousService.prototype._getAllTags =
  205. function (aUrn, aAccountId, aPassword, aListener) {
  206.   this._logger.info ('getAllTags(...)\n');
  207.   var svc = this;
  208.  
  209.   this.api.tagsGet ({
  210.     onError: function () {
  211.       // FIXME: report error?
  212.       /* BUG: 5705 */
  213.       svc._logger.error ('Delicious tags/get failed\n');
  214.       if (aListener)
  215.         aListener.onError ();
  216.     },
  217.     onSuccess: function (aResult, aTopic) {
  218.       // Delete existing tags and insert the new ones - there is probably a more efficient way to do it
  219.       var tags = [];
  220.       for (var i=0; i<aResult.length; i++) {
  221.         if (aResult[i].tag != "system:unfiled")
  222.           tags.push(aResult[i].tag);
  223.       }
  224.       onlineFavoritesBackend.updateTags(svc, aAccountId, tags);
  225.       // Tell the poller we're done
  226.       if (aListener)
  227.         aListener.onResult();
  228.     }
  229.   });
  230. }
  231.  
  232.  
  233. // flockIBookmarkWebService
  234. flockDeliciousService.prototype.publish =
  235. function (aListener, aAccountId, aBookmark, aPrivate) {
  236.   this._logger.info("Publish ("+aBookmark.URL+","+aBookmark.name+") to "+aAccountId+"@Delicious\n");
  237.   var accountUrn = this.urn+':'+aAccountId;
  238.   var password = this.acUtils.getPassword (accountUrn);
  239.   var svc = this;
  240.   var tags = aBookmark.tags;
  241.   tags = tags?tags.split(/[\s,]/).sort().join(' ').replace(/^ /, ''):'';
  242.   var args = {
  243.     url: aBookmark.URL,
  244.     description: aBookmark.name,
  245.     tags: tags,
  246.     extended: aBookmark.description
  247.   };
  248.   if (aPrivate)
  249.     args.shared = 'no';
  250.   this.api.call ('posts/add', args, {
  251.     onError: function () {
  252.       // FIXME: report error?
  253.       /* BUG: 5705 */
  254.       svc._logger.error ('Delicious posts/add failed\n');
  255.       if (aListener)
  256.         aListener.onError (null, null, null);
  257.     },
  258.     onSuccess: function (aXML) {
  259.       if (!aXML || !aXML.documentElement ||
  260.           aXML.documentElement.tagName != 'result') {
  261.         // bad posts/all response
  262.         // FIXME: report error?
  263.         /* BUG: 5705 */
  264.         svc._logger.error ('Delicious posts/add failed - invalid xml response');
  265.         if (aListener)
  266.           aListener.onError (null, null, null);
  267.         return;
  268.       }
  269.       var result = aXML.documentElement.getAttribute("code");
  270.       svc._logger.debug ("Result to posts/add: "+result);
  271.       if (result == "done") {
  272.         var localBookmarks = svc._coop.get(svc.urn+":"+aAccountId+":bookmarks");
  273.         var tagslist = aBookmark.tags.split(" ");
  274.         for (i in tagslist)
  275.           localBookmarks.tag.addOnce(tagslist[i]);
  276.         onlineFavoritesBackend.updateBookmark (svc, accountUrn, aBookmark, aPrivate);
  277.         if (aListener)
  278.           aListener.onSuccess(null, null);
  279.       }
  280.       else {
  281.         if (aListener)
  282.           aListener.onError(null, null, null);
  283.       }
  284.     }
  285.   }, password);
  286. }
  287.  
  288.  
  289. // flockIBookmarkWebService
  290. flockDeliciousService.prototype.publishList =
  291. function (aListener, aAccountId, aBookmarkList, aPrivate) {
  292.   var delay = 1000; // 1 second between each query
  293.   var svc = this;
  294.   this._publishTimer = [];
  295.   var i = 0;
  296.   var sync = [];
  297.   var bookmarks = [];
  298.  
  299.   var sync = {
  300.     notify: function (timer) {
  301.       var bm = bookmarks.shift();
  302.       svc.publish(aListener, aAccountId, bm, aPrivate);
  303.     }
  304.   }
  305.  
  306.   while (aBookmarkList.hasMoreElements()) {
  307.     var bookmark = aBookmarkList.getNext().QueryInterface(Ci.flockIBookmark);
  308.     // Duplicate it because it's going to be removed too early
  309.     bookmarks[i] = {};
  310.     bookmarks[i].URL = bookmark.URL;
  311.     bookmarks[i].name = bookmark.name;
  312.     bookmarks[i].description = bookmark.description;
  313.     bookmarks[i].tags = bookmark.tags;
  314.     bookmarks[i].time = bookmark.time;
  315.     
  316.     this._logger.debug("==== Set a timer to "+i*delay+" for "+bookmarks[i].URL+"\n");
  317.     this._publishTimer[i] = Cc['@mozilla.org/timer;1'].createInstance(Ci.nsITimer);
  318.     this._publishTimer[i].initWithCallback(sync, i * delay, Ci.nsITimer.TYPE_ONE_SHOT);
  319.     i++;
  320.   }
  321. }
  322.  
  323.  
  324. // flockIBookmarkWebService
  325. flockDeliciousService.prototype.remove =
  326. function (aListener, aAccountId, aUrl) {
  327.   this._logger.info("Remove "+aUrl+" from "+aAccountId+"@Delicious\n");
  328.   var password = this.acUtils.getPassword (this.urn+':'+aAccountId);
  329.   var svc = this;
  330.   var args = { url: aUrl };
  331.   this.api.call ('posts/delete', args, {
  332.     onError: function () {
  333.       // FIXME: report error?
  334.       /* BUG: 5705 */
  335.       svc._logger.error ('Delicious posts/delete failed\n');
  336.       if (aListener)
  337.         aListener.onError (null, null, null);
  338.     },
  339.     onSuccess: function (aXML) {
  340.       if (!aXML || !aXML.documentElement ||
  341.           aXML.documentElement.tagName != 'result') {
  342.         // bad posts/all response
  343.         // FIXME: report error?
  344.         /* BUG: 5705 */
  345.         svc._logger.error ('Delicious posts/add failed - invalid xml response');
  346.         if (aListener)
  347.           aListener.onError (null, null, null);
  348.         return;
  349.       }
  350.       var result = aXML.documentElement.getAttribute("code");
  351.       svc._logger.debug ("Result to posts/add: "+result);
  352.       if (result == "done") {
  353.         onlineFavoritesBackend.destroyBookmark (svc, aAccountId, aUrl);
  354.         Cc["@flock.com/poller-service;1"].getService(Ci.flockIPollerService)
  355.           .forceRefresh(this.urn+":"+aAccountId+":bookmarks");
  356.         if (aListener)
  357.           aListener.onSuccess(null, null);
  358.       }
  359.       else {
  360.         if (aListener)
  361.           aListener.onError(null, null, null);
  362.       }
  363.     }
  364.   }, password);
  365. }
  366.  
  367.  
  368. // flockIBookmarkWebService
  369. flockDeliciousService.prototype.exists = function (aAccountId, aURL) {
  370.   return this._coop.Bookmark.exists (this.urn+":"+aAccountId+":"+aURL);
  371. }
  372.  
  373. flockDeliciousService.prototype.getUserUrl = function (aAccountId) {
  374.   return "http://del.icio.us/"+aAccountId;
  375. }
  376.  
  377. // flockIPollingService
  378. flockDeliciousService.prototype.refresh = function (aURN, aListener) {
  379.   var svc = this;
  380.   this._logger.info ('refresh (' + aURN + ')');
  381.  
  382.   if (!this._coop.OnlineBookmarksStream.exists (aURN))
  383.     throw "flockDeliciousService: "+aURN+" can't be found";
  384.  
  385.   var bookmarks = this._coop.get (aURN);
  386.   var accountId = bookmarks.userid;
  387.   var accountUrn = this.urn + ":" + accountId;
  388.   // nsIPassword for auth for this sync
  389.   var password = this.acUtils.getPassword (accountUrn);
  390.  
  391.   this.api.postsAllIfNewer({
  392.     onError: function (aError) {
  393.       svc._logger.error ('Delicious (Delicious API) posts/all failed: ['
  394.                          +aError.errorCode+"] "+aError.errorString+" (["
  395.                          +aError.serviceErrorCode+"] "+ aError.serviceErrorString+")");
  396.       var message;
  397.       switch (aError.errorCode) {
  398.         case aError.FAVS_UNAVAILABLE:
  399.           message = "Del.icio.us reported that the service is currently unavailable; your bookmarks cannot be updated. Contact Delicious for more informations.";
  400.           break;
  401.         case aError.FAVS_INVALID_AUTH:
  402.           message = "Del.icio.us reported that your username or password is wrong. Please log in to Del.icio.us again to update your authentication information.";
  403.           break;
  404.         default:
  405.           message = "Delicious returned an error: ["+aError.serviceErrorCode+"] "+aError.serviceErrorString;
  406.       }
  407.  
  408.       // need this delay for the migration case
  409.       // see https://bugzilla.flock.com/show_bug.cgi?id=9051
  410.       var sync = {
  411.         notify: function (timer) {
  412.           onlineFavoritesBackend.showNotification(message);
  413.         }
  414.       }
  415.       svc._timer = Cc['@mozilla.org/timer;1'].createInstance(Ci.nsITimer);
  416.       svc._timer.initWithCallback(sync, 1000, Ci.nsITimer.TYPE_ONE_SHOT);
  417.  
  418.       if (aListener)
  419.         aListener.onError(aError);
  420.     },
  421.     onSuccess: function (aSubject, aTopic) {
  422.       if (aTopic == "updated") {
  423.         onlineFavoritesBackend.updateLocal(svc, aSubject, accountUrn);
  424.         // Now refresh the tag list (wait one sec)
  425.         var sync = {
  426.           notify: function (timer) {
  427.             svc._getAllTags (aURN, accountId, password, aListener);
  428.           }
  429.         }
  430.         svc._timer = Cc['@mozilla.org/timer;1'].createInstance(Ci.nsITimer);
  431.         svc._timer.initWithCallback(sync, 1000, Ci.nsITimer.TYPE_ONE_SHOT);
  432.       }
  433.       else {
  434.         // Tell the poller we're done
  435.         if (aListener)
  436.           aListener.onResult();
  437.       }
  438.     }
  439.   } , password, bookmarks.last_update_time);
  440. }
  441.  
  442. // nsIObserver
  443. flockDeliciousService.prototype.observe = function (subject, topic, state) {
  444.   switch (topic) {
  445.     case 'xpcom-shutdown':
  446.       var obs = Cc["@mozilla.org/observer-service;1"]
  447.         .getService (Ci.nsIObserverService);
  448.       obs.removeObserver (this, 'xpcom-shutdown');
  449.       return;
  450.   }
  451. }
  452.  
  453.  
  454. /******************************************************************************
  455.  * XPCOM Functions for construction and registration
  456.  ******************************************************************************/
  457.  
  458. function createModule(aParams) {
  459.   return {
  460.     registerSelf: function (aCompMgr, aFileSpec, aLocation, aType) {
  461.       aCompMgr.QueryInterface(Ci.nsIComponentRegistrar);
  462.       aCompMgr.registerFactoryLocation( aParams.CID, aParams.componentName,
  463.                                         aParams.contractID, aFileSpec,
  464.                                         aLocation, aType );
  465.       var catMgr = Cc["@mozilla.org/categorymanager;1"]
  466.         .getService(Ci.nsICategoryManager);
  467.       if (!aParams.categories) { aParams.categories = []; }
  468.       for (var i = 0; i < aParams.categories.length; i++) {
  469.         var cat = aParams.categories[i];
  470.         catMgr.addCategoryEntry( cat.category, cat.entry,
  471.                                  cat.value, true, true ); 
  472.       }
  473.     },
  474.     getClassObject: function (aCompMgr, aCID, aIID) {
  475.       if (!aCID.equals(aParams.CID)) { throw Cr.NS_ERROR_NO_INTERFACE; }
  476.       if (!aIID.equals(Ci.nsIFactory)) { throw Cr.NS_ERROR_NOT_IMPLEMENTED; }
  477.       return { // Factory
  478.         createInstance: function (aOuter, aIID) {
  479.           if (aOuter != null) { throw Cr.NS_ERROR_NO_AGGREGATION; }
  480.           var comp = new aParams.componentClass();
  481.           if (aParams.implementationFunc) { aParams.implementationFunc(comp); }
  482.           return comp.QueryInterface(aIID);
  483.         }
  484.       };
  485.     },
  486.     canUnload: function (aCompMgr) { return true; }
  487.   };
  488. }
  489.  
  490. // NS Module entrypoint
  491. function NSGetModule(aCompMgr, aFileSpec) {
  492.   return createModule({
  493.     componentClass: flockDeliciousService,
  494.     CID: CLASS_ID,
  495.     contractID: CONTRACT_ID,
  496.     componentName: CATEGORY_COMPONENT_NAME,
  497.     implementationFunc: function (aComp) { getCompTK().addAllInterfaces(aComp); },
  498.     categories: [
  499.       { category: "wsm-startup", entry: CATEGORY_COMPONENT_NAME, value: CONTRACT_ID },
  500.       { category: "flockMigratable", entry: CATEGORY_COMPONENT_NAME, value: CONTRACT_ID },
  501.       { category: "flockWebService", entry: CATEGORY_ENTRY_NAME, value: CONTRACT_ID }
  502.     ]
  503.   });
  504. }
  505.  
  506.  
  507. // =======================================================
  508. // ========== BEGIN flockDeliciousAccount class ==========
  509. // =======================================================
  510.  
  511. function flockDeliciousAccount()
  512. {
  513.   this._coop = Cc['@flock.com/singleton;1'].getService(Ci.flockISingleton)
  514.                          .getSingleton('chrome://browser/content/flock/common/load-faves-coop.js')
  515.                          .wrappedJSObject;
  516.   this.acUtils = Cc["@flock.com/account-utils;1"].getService(Ci.flockIAccountUtils);
  517.   this.service = Cc[CONTRACT_ID].getService(Ci.flockIWebService);
  518.   this._ctk = {
  519.     interfaces: [
  520.       "nsISupports",
  521.       "flockIWebServiceAccount",
  522.       "flockIBookmarkWebServiceAccount"
  523.     ]
  524.   };
  525.   this._logger = Cc["@flock.com/logger;1"].createInstance (Ci.flockILogger);
  526.   this._logger.init ("delicious");
  527.   getCompTK().addAllInterfaces(this);
  528. }
  529.  
  530. // BEGIN flockIWebServiceAccount interface
  531. flockDeliciousAccount.prototype.activate =
  532. function flockDeliciousAccount_activate(aListener)
  533. {
  534.   this._logger.debug("{flockIWebServiceAccount}.activate()");
  535.   this._coop.get(this.urn).isAuthenticated = true;
  536.   this._coop.get(this.urn + ':bookmarks').isPollable = true;
  537.   
  538.   if (aListener) {
  539.     aListener.onSuccess(this, "activate");
  540.   }
  541. }
  542.  
  543. flockDeliciousAccount.prototype.keep =
  544. function flockDeliciousAccount_keep(aListener)
  545. {
  546.   this._logger.debug("{flockIWebServiceAccount}.keep()");
  547.   this._coop.get(this.urn).isTransient = false;
  548.   this._coop.get(this.urn+":bookmarks").isTransient = false;
  549.   this.acUtils.makeTempPasswordPermanent(this.urn);
  550.  
  551.   if (aListener) {
  552.     aListener.onSuccess(this, "keep");
  553.   }
  554. }
  555.  
  556.  
  557. // END flockIWebServiceAccount interface
  558.  
  559. // BEGIN flockIMigratable
  560. flockDeliciousService.prototype.__defineGetter__('shortname', function() {
  561.   return "del.icio.us";
  562. });
  563.  
  564. flockDeliciousService.prototype.needsMigration =
  565. function flockDeliciousService_needsMigration(oldVersion)
  566. {
  567.   // if online bookmarks webservice is configured AND using delicious
  568.   var pw = this.acUtils.getFirstPasswordForHost(OLD_DELICIOUS_PW_HOST);
  569.   if (PREFS.getPrefType(WEBSERVICE_PREF) && PREFS.getCharPref(WEBSERVICE_PREF) == 'delicious') {
  570.     if (pw) {
  571.       return true;
  572.     } else {
  573.       return false;
  574.     }
  575.   } else {
  576.     // delicious is not configured so we might as well delete the pm entry
  577.     // since account info is stored in rdf after migration
  578.     if (pw) {
  579.       var pm = Components.classes["@mozilla.org/passwordmanager;1"]
  580.                          .getService(Ci.nsIPasswordManager);
  581.       pm.removeUser(OLD_DELICIOUS_PW_HOST, pw.user);
  582.     }
  583.     return false;
  584.   }
  585. }
  586.  
  587. flockDeliciousService.prototype.startMigration =
  588. function flockDeliciousService_startMigration(oldVersion, aFlockMigrationProgressListener)
  589. {
  590.    var ctxt = {
  591.      listener: aFlockMigrationProgressListener
  592.    };
  593.  
  594.   return { wrappedJSObject: ctxt };
  595. }
  596.  
  597. flockDeliciousService.prototype.finishMigration =
  598. function flockDeliciousService_finishMigration(ctxtWrapper)
  599. {
  600. }
  601.  
  602. flockDeliciousService.prototype.doMigrationWork =
  603. function flockDeliciousService_doMigrationWork(ctxtWrapper)
  604. {
  605.   ctxt = ctxtWrapper.wrappedJSObject;
  606.  
  607.   if (!ctxt.deliciousMigrator)
  608.     ctxt.deliciousMigrator = this._migrateDeliciousAccount(ctxt);
  609.   if (ctxt.deliciousMigrator.next())
  610.     ctxt.deliciousMigrator = null;
  611.  
  612.   return Boolean(ctxt.deliciousMigrator);
  613. }
  614.  
  615. flockDeliciousService.prototype._migrateDeliciousAccount =
  616. function flockDeliciousService_migrateDeliciousAccount(ctxt)
  617. {
  618.   this.init();
  619.   var pm = Components.classes["@mozilla.org/passwordmanager;1"]
  620.                      .getService(Ci.nsIPasswordManager);
  621.   var pw = this.acUtils.getFirstPasswordForHost(OLD_DELICIOUS_PW_HOST);
  622.  
  623.   // migrate online bm privacy settings
  624.   PREFS.setBoolPref("flock.favorites.do." + CONTRACT_ID + "--" + pw.user, true);
  625.   PREFS.setBoolPref("flock.favorites.private." + CONTRACT_ID + "--" + pw.user,
  626.                     PREFS.getBoolPref("flock.favorites.privateByDefault"));
  627.  
  628.   var accountURN = "urn:delicious:service:" + pw.user;
  629.   pm.addUser(accountURN, pw.user, pw.password);
  630.   pm.removeUser(OLD_DELICIOUS_PW_HOST, pw.user);
  631.   var acct = this.addAccountById(pw.user, false, null);
  632.   acct.activate(null);
  633.   acct.keep(null);
  634.   
  635.   yield true;
  636. }
  637. // END flockIMigratable
  638.